package apis

import (
	"gitee.com/sansaniot/ssiot-core/httpmvc/api"
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"

	"ssdevice/common/enums"
	"ssdevice/internal/device/models"
	"ssdevice/internal/device/models/command"
	"ssdevice/internal/device/models/query"
	"ssdevice/internal/device/service"
)

type Device struct {
	api.Api
}

// 查询设备列表
func (e Device) FindList(c *gin.Context) {
	// 请求参数
	req := query.SysDevQuery{}
	// 模型
	m := models.SysDev{}
	// 上下文
	err := e.MakeContext(c).Bind(&req).MakeModel(&m.Model).Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 执行
	var result interface{}
	req.Type = enums.DevTypeOfDevice
	req.LoadUser(c)
	if err, result = m.FindDeviceList(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(result)
}

// 查询设备
func (e Device) FindOne(c *gin.Context) {
	// 请求参数
	req := query.SysDevQuery{}
	// 模型
	m := models.SysDev{}
	// 上下文
	err := e.MakeContext(c).Bind(&req).MakeModel(&m.Model).Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 执行
	var result interface{}
	req.Type = enums.DevTypeOfDevice
	req.LoadUser(c)
	if err, result = m.FindDevice(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(result)
}

// 添加设备
func (e Device) AddDevice(c *gin.Context) {
	// 请求参数
	req := command.DeviceInsertReq{}
	// 业务service
	s := &service.Device{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetAllModel()
	// 用户信息
	req.LoadUser(c)
	// 执行
	var result models.SysDev
	req.Type = enums.DevTypeOfDevice
	if err, result = s.AddDevice(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Data(result)
}

// 编辑设备(基本信息)
func (e Device) EditDevice(c *gin.Context) {
	// 请求参数
	req := command.DeviceEditReq{}
	// 业务service
	s := &service.Device{}
	// 模型
	dev := &models.SysDev{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeModel(&dev.Model).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetDevModel(dev)
	// 用户信息
	req.LoadUser(c)
	// 执行
	req.Type = enums.DevTypeOfDevice
	if err = s.ModDevice(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}

// 初始化设备名称（产品名称+SN后4位）
func (e Device) InitName4Product(c *gin.Context) {
	// 请求参数
	req := query.SysDevQuery{}
	// 业务service
	s := &service.Device{}
	// 模型
	dev := &models.SysDev{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeModel(&dev.Model).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetDevModel(dev)
	// 用户信息
	req.LoadUser(c)
	// 执行
	req.Type = enums.DevTypeOfDevice
	var res []string
	if err = s.InitName4Product(&req, &res); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(res)
}

// 删除设备
func (e Device) DeleteDevice(c *gin.Context) {
	// 请求参数
	req := command.DeviceDeleteReq{}
	// 业务service
	s := &service.Device{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetAllModel()
	// 用户信息
	req.LoadUser(c)
	// 执行
	req.DelType = enums.DevTypeOfDevice
	if err = s.DeleteDevice(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}

// 批量分组
func (e Device) ChangeGroup(c *gin.Context) {
	// 请求参数
	req := command.BatchGroupReq{}
	// 业务service
	s := &service.Device{}
	// 模型
	dev := &models.SysDev{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeModel(&dev.Model).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetDevModel(dev)
	// 执行
	if err = s.ChangeGroup(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}

// 设备配置下发
func (e Device) SetDeviceConfig(c *gin.Context) {
	// 请求参数
	req := command.DevicePropsSetReq{}
	// 业务service
	s := &service.Device{}
	// 模型
	dev := &models.SysDev{}
	devConfig := &models.SysDevConfig{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeModel(&dev.Model,
			&devConfig.Model,
		).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetDevModel(dev).SetConfigModel(devConfig)
	// 用户信息
	req.LoadUser(c)
	// 执行
	if err = s.SetDeviceConfig(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}

// 设备配置获取
func (e Device) GetDeviceConfig(c *gin.Context) {
	// 请求参数
	req := command.DevicePropsGetReq{}
	// 业务service
	s := &service.Device{}
	// 模型
	dev := &models.SysDev{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeModel(&dev.Model).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetDevModel(dev)
	// 执行
	var result interface{}
	if err, result = s.GetDeviceConfig(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(result)
}

// 设备变量下发
func (e Device) SetDeviceSensor(c *gin.Context) {
	// 请求参数
	req := command.DeviceSensorSetReq{}
	// 业务service
	s := &service.Device{}
	// 模型
	dev := &models.SysDev{}
	devSensor := &models.SysDevSensor{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeModel(&dev.Model,
			&devSensor.Model,
		).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetDevModel(dev).SetSensorModel(devSensor)
	// 用户信息
	req.LoadUser(c)
	// 执行
	if err = s.SetDeviceSensor(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}

// 设备变量获取
func (e Device) GetDeviceSensor(c *gin.Context) {
	// 请求参数
	req := command.DeviceSensorGetReq{}
	// 业务service
	s := &service.Device{}
	// 模型
	dev := &models.SysDev{}
	devSensor := &models.SysDevSensor{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeModel(&dev.Model,
			&devSensor.Model,
		).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetDevModel(dev).SetSensorModel(devSensor)
	// 用户信息
	req.LoadUser(c)
	// 执行
	var result interface{}
	if result, err = s.GetDeviceSensor(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(result)
}

// 设备下发控制
func (e Device) SendDeviceFunc(c *gin.Context) {
	// 请求参数
	req := command.DeviceFuncSetReq{}
	// 业务service
	s := &service.Device{}
	// 模型
	dev := &models.SysDev{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeModel(&dev.Model).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetDevModel(dev)
	// 用户信息
	req.LoadUser(c)
	// 执行
	var result interface{}
	if result, err = s.SendDeviceFunc(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Data(result)
}

// 查询设备历史数据
func (e Device) GetDeviceHistoryData(c *gin.Context) {
	// 请求参数
	req := query.DevDataQuery{}
	// 业务service
	s := &service.Device{}
	// 模型
	dev := &models.SysDev{}
	devConfig := &models.SysDevConfig{}
	// 上下文
	err := e.MakeContext(c).
		Bind(&req).
		MakeModel(&dev.Model,
			&devConfig.Model,
		).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetDevModel(dev).SetConfigModel(devConfig)
	// 执行
	var result interface{}
	if err, result = s.GetDeviceHistoryData(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(result)
}

func (e Device) GetDeviceHistorySystem(c *gin.Context) {
	// 请求参数
	req := query.DevDataQuery{}
	// 业务service
	s := &service.Device{}
	// 模型
	dev := &models.SysDev{}
	// 上下文
	err := e.MakeContext(c).
		Bind(&req).
		MakeModel(&dev.Model).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetDevModel(dev)
	// 执行
	var result interface{}
	if err, result = s.GetDeviceHistorySystem(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(result)
}

// 查询设备历史数据
func (e Device) GetDeviceHistoryReport(c *gin.Context) {
	// 请求参数
	req := query.DevHistStatQuery{}
	// 业务service
	s := &service.Device{}
	// 上下文
	err := e.MakeContext(c).
		Bind(&req, binding.JSON).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	// 执行
	var result interface{}
	if err, result = s.GetDeviceHistoryDataReport(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(result)
}

// 查询设备历史数据
func (e Device) FindDeviceHistoryData(c *gin.Context) {
	// 请求参数
	req := query.DevDataQuery{}
	// 业务service
	s := &service.Device{}
	// 模型
	dev := &models.SysDev{}
	// 上下文
	err := e.MakeContext(c).
		Bind(&req).
		MakeModel(&dev.Model).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetDevModel(dev)
	req.LoadUser(c)
	// 执行
	var result interface{}
	if err, result = s.FindDeviceHistoryData(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(result)
}

func (e Device) FindDeviceHistorySystem(c *gin.Context) {
	// 请求参数
	req := query.DevDataQuery{}
	// 业务service
	s := &service.Device{}
	// 模型
	dev := &models.SysDev{}
	// 上下文
	err := e.MakeContext(c).
		Bind(&req).
		MakeModel(&dev.Model).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetDevModel(dev)
	req.LoadUser(c)
	// 执行
	var result interface{}
	if err, result = s.FindDeviceHistorySystem(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(result)
}

// 设备保存为产品
func (e Device) DeviceSaveProduct(c *gin.Context) {
	// 请求参数
	req := command.DeviceSaveProductReq{}
	// 业务service
	s := &service.Device{}
	// 模型
	dev := &models.SysDev{}
	devSensor := &models.SysDevSensor{}
	devConfig := &models.SysDevConfig{}
	devFunc := &models.SysDevFunc{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeModel(&dev.Model,
			&devSensor.Model,
			&devConfig.Model,
			&devFunc.Model,
		).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetDevModel(dev).SetSensorModel(devSensor).SetConfigModel(devConfig).SetFuncModel(devFunc)
	// 用户信息
	req.LoadUser(c)
	// 执行
	if err = s.DeviceSaveProduct(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}

// 查询设备列表
func (e Device) FindAllList(c *gin.Context) {
	// 请求参数
	req := query.SysDevQuery{}
	// 模型
	m := models.SysDev{}
	// 上下文
	err := e.MakeContext(c).Bind(&req).MakeModel(&m.Model).Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 执行
	var result interface{}
	req.LoadUser(c)
	if err, result = m.FindDeviceList(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(result)
}

// 查询设备统计信息
func (e Device) FindStatCount(c *gin.Context) {
	// 请求参数
	req := query.SysDevQuery{}
	// 模型
	m := models.SysDev{}
	// 上下文
	err := e.MakeContext(c).Bind(&req).MakeModel(&m.Model).Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 执行
	var result interface{}
	req.LoadUser(c)
	if err, result = m.FindStatCount(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(result)
}

// 配置整体操作
func (e Device) UpsertEntireConfig(c *gin.Context) {
	// 请求参数
	req := command.DeviceConfigReq{}
	// 业务service
	s := &service.Device{}
	// 模型
	dev := &models.SysDev{}
	devConfig := &models.SysDevConfig{}
	productModel := &models.SysDevProduct{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req).
		MakeModel(&dev.Model,
			&devConfig.Model,
			&productModel.Model,
		).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetDevModel(dev).SetConfigModel(devConfig).SetProductModel(productModel)
	req.DeviceType = enums.DevTypeOfDevice
	// 用户信息
	req.LoadUser(c)
	// 执行
	if err = s.UpsertEntireConfig(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}

func (e Device) ChannelDiagnose(c *gin.Context) {
	// 请求参数
	req := command.ChanelDiagnoseReq{}
	// 业务service
	s := &service.Device{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 用户信息
	req.LoadUser(c)
	// 执行
	result := s.ChannelDiagnose(&req)
	// 返回
	e.Ok(result)
}
